<?php

namespace action\admin;

use \cass\formulaire AS form;

class usersAction extends \cass\Action {

    /**
     * Méthode par défaut
     */
    public function init() {
	$this->forwardEven($this->getSession()->hasCredential('admin_users'), '@403');

	// Infos de la page
	$this->addToAriane('class', 'users'); // Pas de fil d'ariane sur l'admin, mais on y stocke la classe du titre
    }

    /**
     * Méthode de gestion des accès
     */
    public function execute($_page = null) {
	// Infos de la page
	$this->setTitle('Gestion des utilisateurs'); 

	// Formulaire de recherche d'un utilisateur
	$formulaire = new form\Formulaire('Recherche d\'un utilisateur');
	$formulaire->setTemplate('_formList');
	$formulaire->setButtons('submit', 'Chercher');

	$val = 'Id, identifiant ou adresse e-mail';
	$formulaire->append(new form\Input($val, $val));

	$filter = null;
	$query = $this->doctrine->createQuery('SELECT u FROM User u');

	// Vérifications
	if ($formulaire->isPosted()) {}

	// Enregistrements
	if ($formulaire->isPostedWithoutError()) {
	    if ($formulaire->getValue($val) != $val) {
		$this->filter = $formulaire->getValue($val);

		$query = $this->doctrine->createQuery('SELECT u FROM User u WHERE u.name LIKE :filter OR u.id=:nofilter OR u.email LIKE :filter')
				->setParameter('filter', '%' . $this->filter . '%')
				->setParameter('nofilter', $this->filter);
	    }
	}

	$pagination = new \cass\Pagination($query);
	$pagination->setUri(\cass\Uri::create('admin', 'users'));
	$pagination->setCurrentPage($_page);
	$pagination->setNbByPage(20);
	$this->users = $pagination->getElements();
	$this->pagination = $pagination;
	$this->formulaire = $formulaire;
    }

    /**
     * Modifie un user
     * @param <integer> $_user Id du user à modifier
     */
    public function executeEdit($_user) {
	// Infos de la page
	$this->setTitle('Modification d\'un utilisateur');

	// Sélection des accès
	$user = $this->doctrine->find('User', $_user);
	$userGroups = array();
	foreach ($user->getGroups() AS $group) {
	    $userGroups[] = $group->getId();
	}

	// Formulaire de modification
	$formulaire = new form\Formulaire('Modification d\'un utilisateur');
	$formulaire->setButtons('submit', 'Modifier l\'utilisateur');
	if ($user->getAvatar() != null) {
	    $formulaire->addToLinks('Supprimer l\'avatar', url_for('admin', 'users', 'delete-avatar', array($_user)));
	}
	$formulaire->addToLinks('Retour à la gestion des utilisateurs', url_for('admin', 'users'));
	$multi = new form\Multi('Groupes', $userGroups, false);
	$groups = $this->doctrine->getRepository('Group')->findAll();
	foreach ($groups AS $group) {
	    $multi->addToPossibleValues($group->getId(), $group->getName());
	}

	$formulaire->append(new form\Input('Identifiant', $user->getName(), true, 'Votre identifiant de connexion'));
	$formulaire->append(new form\Input('Adresse e-mail', $user->getEmail(), true, 'Format mon.adresse@domaine.ntd'));
	$formulaire->append(new form\InputImage('Avatar', $user->getAvatar(), false, 'Préférez une hauteur de 200px et une largeur de 150px'));
	$formulaire->append(new form\Password('Nouveau mot de passe', '', false, 'Choisissez un mot de passe personnel et sécurisé'));
	$formulaire->append(new form\Password('Confirmation du nouveau mot de passe', '', false, 'Pour éviter les fautes de frappe'));
	$formulaire->append($multi);

	// Vérifications
	if ($formulaire->isPosted()) {
	    // Format de l'adresse e-mail et libre ?
	    if (!$formulaire->{'Adresse e-mail'}->isError()) {
		if (!preg_match(\cass\Data::regex('email'), $formulaire->getValue('Adresse e-mail'))) {
		    $formulaire->{'Adresse e-mail'}->setError('Format attendu : mon.adresse@domaine.ntd');
		} elseif (($formulaire->getValue('Adresse e-mail') != $user->getEmail()) AND
			($this->doctrine->getRepository('User')->findByName($formulaire->getValue('Adresse e-mail')) != null)) {
		    $formulaire->{'Adresse e-mail'}->setError('L\'adresse e-mail indiquée est déjà utilisée');
		}
	    }

	    // Identifiant libre ?
	    if (!$formulaire->{'Identifiant'}->isError() AND
		    ($formulaire->getValue('Identifiant') != $user->getName() ) AND
		    ($this->doctrine->getRepository('User')->findByName($formulaire->getValue('Identifiant')) != null)) {
		$formulaire->{'Identifiant'}->setError('L\'identifiant indiqué est déjà utilisé');
	    }

	    // Vérification du mot de passe actuel
	    if (!$formulaire->{'Nouveau mot de passe'}->isError() AND !$formulaire->{'Confirmation du nouveau mot de passe'}->isError() AND
		    ( $formulaire->getValue('Nouveau mot de passe') != $formulaire->getValue('Confirmation du nouveau mot de passe') )) {
		$formulaire->{'Nouveau mot de passe'}->setError('Le mot de passe et sa confirmation doivent être identiques');
		$formulaire->{'Confirmation du nouveau mot de passe'}->setError('Ce mot de passe est différent du nouveau mot de passe');
	    }
	}

	// Enregistrements
	if ($formulaire->isPostedWithoutError()) {
	    // Met à jour l'utilisateur
	    $user->setName($formulaire->getValue('Identifiant'));
	    $user->setEmail($formulaire->getValue('Adresse e-mail'));

	    // Mot de passe
	    if ($formulaire->getValue('Nouveau mot de passe') != '') {
		$user->setPassword(encrypt($formulaire->getValue('Nouveau mot de passe'), $user->getSalt()));
	    }

	    // Droits
	    $user->getGroups()->clear();
	    foreach ($formulaire->getValue('Groupes') AS $group) {
		$user->addGroups($this->doctrine->find('Group', $group));
	    }

	    // Avatar
	    if ($formulaire->{'Avatar'}->isProperties()) {
		$path = $formulaire->{'Avatar'}->upload(\cass\Data::directories('upload_avatars'));
		if (($user->getAvatar() != null ) AND file_exists(__PATH__ . $user->getAvatar())) {
		    unlink(__PATH__ . $user->getAvatar());
		}
		$user->setAvatar($path);
	    }
	    $this->doctrine->flush();
	    $formulaire->setConfirm('L\'utilisateur a été modifié. Retournez à <a href="' . url_for('admin', 'users') . '">la gestion des utilisateurs</a>.');
	}

	// Assignations
	$this->formulaire = $formulaire;
    }

    /**
     * Supprime un utilisateur
     * @param <integer> $_user Id de l'utilisateur à supprimer 
     */
    public function executeDelete($_user) {
	// Infos de la page
	$this->setTitle('Suppression d\'un utilisateur');

	// Sélection du profil de l'utilisateur
	$user = $this->doctrine->find('User', $_user);

	// Formulaire de confirmation de suppression
	$formulaire = new form\Formulaire('Suppression d\'un utilisateur');
	$formulaire->setButtons('submit', 'Supprimer l\'utilisateur');
	$formulaire->addToLinks('Retour à la gestion des utilisateurs', url_for('admin', 'users'));
	$formulaire->append(new form\Text('Confirmez vous la suppression de l\'utilisateur ' . $user->getName() . ' ?<br /><strong>Attention:</strong> Toutes ses interventions seront supprimées (irréversible)'));

	// Vérifications
	if ($formulaire->isPosted()) {}

	// Enregistrements
	if ($formulaire->isPostedWithoutError()) {
	    // Supprime l'avatar s'il y en a un
	    if (($user->getAvatar() != null ) AND file_exists(__PATH__ . $user->getAvatar())) {
		unlink(__PATH__ . $user->getAvatar());
	    }
	    $this->doctrine->remove($user);
	    $this->doctrine->flush();
	    $formulaire->setConfirm('L\'utilisateur a été supprimé. Retournez à <a href="' . url_for('admin', 'users') . '">la gestion des utilisateurs</a>.');
	}

	// Assignations
	$this->formulaire = $formulaire;
    }

    /**
     * Supprime l'avatar de l'utilisateur
     * @param <integer> $_user Id de l'utilisateur
     */
    public function executeDeleteAvatar($_user) {
	// Sélection l'utilisateur et son avatar
	$user = $this->doctrine->find('User', $_user);
	$avatar = $user->getAvatar();

	// Supprime si l'avatar existe
	if (!empty($avatar) AND file_exists(__PATH__ . $avatar)) {
	    unlink(__PATH__ . $avatar);
	    $user->setAvatar(null);
	    $this->doctrine->flush();
	}

	// Redirige vers la modification de cet utilisateur
	$this->redirect('admin', 'users', 'edit', array($_user));
    }

}